//引入下载好的express框架
const express = require('express');
//引入系统模块path用于拼接路径
const path = require('path');
//引入下载好的body-parser模块用来处理post请求参数
const bodyParser = require('body-parser');
//导入下载好的express-session模块用于配置session储存信息
const session = require('express-session');
//导入下载好的dateformat模块用于处理时间格式
const dateFormat = require('dateformat');
//导入art-template模块（因为下载好了express-art-template里面自带art-template）
const template = require('art-template');
//导入下载好的morgan模块用于把客户端发送到服务器端的信息打印到控制台当中
//就是终端里打印的响应事件请求路径请求方式等信息
const morgan = require('morgan');
//导入下载好的config模块 用于处理配置信息
const config = require('config');
//创建网站服务器
const app = express();
//数据库连接
require('./model/connect');
//拦截请求并处理post请求
app.use(bodyParser.urlencoded({ extended: false }));
//拦截请求并配置session  第二个对象是当我们退出是不要生成一个空的Cookie
app.use(session({
    secret: 'secret key',
    saveUninitialized: false,
    //一天后登录状态失效
    cookie: {
        maxAge: 24 * 60 * 60 * 1000
    }
}
));
//开放静态资源文件
app.use(express.static(path.join(__dirname, 'public')));
//处理配置信息
//获取系统环境变量(process是自带的)  返回值是对象里面存储了自己定义的环境变量名NODE_NAV
if (process.env.NODE_ENV == 'development') {
    //当前为开发环境
    console.log('当前是开发环境');
    //调用morgin响应到控制台  并且这个方法只会打印在开放环境当中 生产环境不会打印出来
    app.use(morgan('dev'));
} else {
    //当前为生产环境 production是生产环境变量值
    console.log('当前是生产环境');
}
//配置模板
//1.告诉express框架模板所在的位置
app.set('views', path.join(__dirname, 'views'));
//2.告诉express框架模板的默认后缀是什么
app.set('view engine', 'art');
//当渲染后缀为art的模板时，使用的模板引擎是什么
app.engine('art', require('express-art-template'));
//向模板内部导入dateFormat变量
template.defaults.imports.dateFormat = dateFormat;
//创建路由
const home = require('./route/home');
const admin = require('./route/admin');
//拦截请求并判断是否是登录状态
app.use('/admin', require('./middleware/loginGuard'));
//匹配请求路径
app.use('/home', home);
app.use('/admin', admin);
//错误处理中间件
app.use((err, req, res, next) => {
    //next存储的错误信息被集中到了在err里
    //将字符串对象转换为对象类型
    //JSON.parse()
    const result = JSON.parse(err);
    //传递对象参数到 res.redirect()时是不固定参数个数
    let params = [];
    for (let attr in result) {
        if (attr != 'path') {
            //把不是path的对象添加到数组当中
            params.push(attr + '=' + result[attr]);
        }
    }
    // join()方法是指定数值内元素以指定字符进行拼接转换成字符串
    res.redirect(`${result.path}?${params.join('&')}`);
});

//监听端口
app.listen(80);
console.log('正在监听80端口');